/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ants;

import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.ListIterator;
import java.awt.Point;
import java.util.HashMap;
import javax.swing.*;

/**
 *
 * @author Sagrevyum
 */
public class AntsClient {

    int foodRest;
    GamePlay world;
    LinkedList moves;
    Mapa map;
    Point nest;
    GuiClient gui;
    ArrayList<AntsBehave> ants;
    Logic l;
    JFrame wphe1, wphe2,wdir; 
    FTablero c1,c2,c3;
    boolean antscreated = false;
    int tilesize;
    public static void main(String[] args) throws ClassNotFoundException, IOException {

        AntsClient client = new AntsClient();
        client.start();
    }

    AntsClient() throws IOException{
        l = new Logic();
        tilesize = 40;
        ants = new ArrayList<AntsBehave>();
        map = new Mapa("map.txt");
        gui = new GuiClient(map);
        gui.setVisible(true);
        gui.setTitle("Panel principal de control con boton de autodestruccion");
        wphe1 = new JFrame("Feromona 1");
        wphe2 = new JFrame("Feromona 2");
        wdir = new JFrame("Feromona 3");
        wphe1.setSize(500, 500);
        wphe2.setSize(500, 500);
        wdir.setSize(500, 500);
        c1 = new FTablero(map,0, true, tilesize);
        c2 = new FTablero(map,1, true, tilesize);
        c3 = new FTablero(map,0, false, tilesize);
        wphe1.add(c1);
        wphe2.add(c2);
        wdir.add(c3);
        wphe1.setVisible(true);
        wphe2.setVisible(true);
        wdir.setVisible(true);
    }
    
    public void start()throws ClassNotFoundException, IOException {
        int n = 1;
        //try{
       // AntsBehave a = new AntsBehave(n++, Constantes.explorer_id,nest.x, nest.y, 0);
        //}catch(Exception e){
        //    System.out.println(e.getMessage());
        //}
       
        try { 
        	Socket socket = new Socket("localhost", 5000); 
            InputStream aux = socket.getInputStream();
            ObjectInputStream entradaObjetos = new ObjectInputStream(aux);
            OutputStream aux2 = socket.getOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(aux2);
            
            // Leer estado inicial
            Inicial ini = (Inicial)entradaObjetos.readObject();
            map.getInicial(ini);
            nest = map.getHormiguero();
            //nest = new Point(1,1);
            if(antscreated == false){
                    for(int i = 0; i < ini.getExploradoras(); i++){
                        //a = new AntsBehave(n++, Constantes.explorer_id,nest.x, nest.y, 0);
                        ants.add(new AntsBehave(n++, Constantes.explorer_id,nest.x, nest.y, 0));
                    }
                    for(int i = 0; i < ini.getObreras(); i++){
                        ants.add(new AntsBehave(n++, Constantes.worker_id,nest.x, nest.y, 0));
                    }
                    for(int i = 0; i < ini.getGuerreras(); i++){
                        ants.add(new AntsBehave(n++, Constantes.warrior_id,nest.x, nest.y, 0));
                    }
                    antscreated = true;
            }
            //System.out.println("Recibi el mapa");

            while (gui.run) {
                // Recibir vistas
                FinalView fview = (FinalView) entradaObjetos.readObject();
                AntsView view = fview.returnView();
                map.getAntsView(view, ants);
                //gui.getMap(map);
                c1.getMap(map);
                c2.getMap(map);
                c3.getMap(map);
                //System.out.println("Recibi el AntsView");
                MoveList movimientos = l.Logics(map, ants, view);
                //System.out.println("Mandar movimiento?");
                //System.in.read();
                // Mandar movimientos
                os.writeObject(movimientos);
                //System.out.println("Mande los movimientos");
                HashMap compiladoconocimiento = (HashMap) entradaObjetos.readObject();
                //compiladoconocimiento = null; //lo hago para que el GC lo borre cuando pueda por que nos causa pedos;
                Conocimiento[] conocimientoHormiga;
                for(int x= 0;x<ants.size();x++){
                   if(compiladoconocimiento.containsKey(x)){
                       Perspective_k pk = (Perspective_k)fview.aview.perspectiva.get(x);
                       AntsBehave temp = null;
                       for(int an = 0; an < ants.size(); an++){
                           if(ants.get(an).id == x){
                               temp = (AntsBehave) ants.get(an);
                           }
                       }
                       if (temp == null)
                           continue;
                       conocimientoHormiga = (Conocimiento[]) compiladoconocimiento.get(x);
                       if(temp.conocimiento != null){

                           temp.conocimientoMerge(conocimientoHormiga, pk);

                       }
                       else{
                           temp.setConocimiento(conocimientoHormiga, pk); 
                       }
                   }
                }
                try{
                    Thread.sleep (300);
                }catch(Exception e){}
            }
        }catch(IOException e){
            System.out.println(e.getMessage());
        }
    }
}

